/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#include "Bala.h"
using namespace Entidades;

Bala::Bala(int duracion,double direccion, int velocidad, double posicionX, double posicionY, string pathDeLaImagen, 
	int anchoDeLaImagen, int altoDeLaImagen, double rotacionDeLaImagen, int poderDeDestruccion)
	:Arma(duracion,direccion, velocidad, posicionX, posicionY,pathDeLaImagen, anchoDeLaImagen, altoDeLaImagen, rotacionDeLaImagen,1){
	
	this->poderDeDestruccion = poderDeDestruccion;
}

char Bala::getTipo(){
	return 'A';
}

int Bala::colisionar(int danio){

	this->duracion = 0;
	this->estado = 'E';

	return poderDeDestruccion;
}

bool Bala::hayColisionEnElFuturoCon(Colisionable * otroColisionable){

	bool hayColision = false;

	// armo un rectángulo con el otroColisionable
	Rectangulo * bordeDelOtroColisionable = new Rectangulo(otroColisionable->getPosicionX(), otroColisionable->getPosicionY(), otroColisionable->getAnchoDeLaImagen(), otroColisionable->getAltoDeLaImagen());
	Rectangulo * rectanguloFuturo = new Rectangulo();

	rectanguloFuturo->setAncho(this->getAnchoDeLaImagen());
	rectanguloFuturo->setAlto(this->getAltoDeLaImagen());

	// tomo todos los puntos entre el actual y el del futuro
	double posicionActualX = this->getPosicionX();
	double posicionActualY = this->getPosicionY();
	int velocidad = ceil(this->getVelocidad());

	for(int i = 0; i < velocidad; i++){
		rectanguloFuturo->setX(cos(this->getDireccionActual() * (PI/180)) * (i + 1) + posicionActualX);
		rectanguloFuturo->setY(sin(this->getDireccionActual() * (PI/180)) * (i + 1) + posicionActualY);

		//sólo me quedo con las coordenadas que están tocando al otro
		bool hayInterseccion = bordeDelOtroColisionable->hayIntereseccion(rectanguloFuturo);
		if (hayInterseccion){
			hayColision = this->hayColisionDeImagenEnElFuturoCon(rectanguloFuturo, otroColisionable);

			if (hayColision){
				break;
			}
		}
	}

	delete bordeDelOtroColisionable;
	delete rectanguloFuturo;

	return hayColision;
}

bool Bala::hayColisionDeImagenEnElFuturoCon(Rectangulo * rectanguloA, Colisionable * colisionableB){

	int techoB = colisionableB->getPosicionY();
	int pisoB = colisionableB->getPosicionY() + colisionableB->getAltoDeLaImagen();
	int izquierdaB = colisionableB->getPosicionX();
	int derechaB = colisionableB->getPosicionX() + colisionableB->getAnchoDeLaImagen();

	//Calculo el area de la interseccion de ambas cajas
	int interIzq = this->calcularMaximo(rectanguloA->getLadoIzquierdo(), izquierdaB);
	int interDer = this->calcularMinimo(rectanguloA->getLadoDerecho(), derechaB);
	int interTecho = this->calcularMaximo(rectanguloA->getTecho(), techoB);
	int interPiso = this->calcularMinimo(rectanguloA->getPiso(), pisoB);

	//Recorro los pixels del rect1 y cheque colisiones de pixeles con la superficie del rect2
	Uint32 pixelClave2 = 0;
	Uint32 pixelClave4=  colisionableB->getUltimaRotacion()->format->colorkey;
	Uint32 pixel2 = NULL;

	for (int i = interTecho; i < interPiso; i ++){
		for (int j = interIzq; j < interDer ; j ++){
			//Calcular el offset de la interseccion para cada superficie
			pixel2 = colisionableB->getPixel(j - izquierdaB ,i - techoB);

			if(pixel2 != pixelClave2 && pixel2 != pixelClave4){
				return true;
			}
		}
	}

	return false;
}

Bala::~Bala(){}
